package com.banch.cloud.hystrix.service.impl;

import cn.hutool.core.util.IdUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.concurrent.TimeUnit;

/**
 * payment
 *
 * @author banch
 * @version 1.0
 * @date 2020/7/9
 */
@Service
public class PaymentServiceImpl {


    //===========服务降级 开始============

    /**
     * description
     *
     * @param
     * @return
     * @author banch
     * @date 2020/7/10
     * @throw
     **/
    public String paymentInfoOK(Integer id) {
        return "thread:" + Thread.currentThread().getName() + ",paymentInfoOK,id:" + id + "\t O(n_n)O哈哈哈";
    }


    /**
     * description
     *
     * @param
     * @return
     * @author banch
     * @date 2020/7/10
     * @throw
     **/
    @HystrixCommand(fallbackMethod = "paymentInfoTimeoutHandler",
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")  //设置线程超时时间3秒钟
            })
    public String paymentInfoTimeout(Integer id) {
        int time = 4;
        //int i = 1 / 0;
        try {
            TimeUnit.SECONDS.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "thread:" + Thread.currentThread().getName() + ",paymentInfoTimeout,id:" + id + "\t O(n_n)O哈哈哈" + ",耗时" + time + "秒";
    }

    /**
     * 服务降级方法。需要与原来方法的签名一致
     *
     * @param
     * @return
     * @author banch
     * @date 2020/7/10
     * @throw
     **/
    public String paymentInfoTimeoutHandler(Integer id) {
        return "thread:" + Thread.currentThread().getName() + ",paymentInfoTimeoutHandler,id:" + id + "\t (-_-)";
    }

    //===========服务降级 结束============


    //===========服务熔断 开始============

    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",
            commandProperties = {
                    @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),  //是否开启断路器
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),   //请求次数
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),  //时间范围
                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //失败率达到多少后跳闸
            }
    )
    public String paymentCircuitBreaker(Integer id) {
        if (id < 0) {
            throw new RuntimeException("*****id 不能负数");
        }
        String serialNumber = IdUtil.simpleUUID();

        return Thread.currentThread().getName() + "\t" + "调用成功,流水号：" + serialNumber;
    }

    public String paymentCircuitBreaker_fallback(Integer id) {
        return "id 不能负数，请稍候再试,(┬＿┬)/~~     id: " + id;
    }


}